home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / lib / ubuntuone-client / ubuntuone-syncdaemon
Text File  |  2009-10-29  |  7KB  |  187 lines

  1. #!/usr/bin/python
  2.  
  3. # ubuntuone-syncdaemon - Ubuntu One storage synchronization daemon
  4. #
  5. # Author: Guillermo Gonzalez <guillermo.gonzalez@canonical.com>
  6. #
  7. # Copyright 2009 Canonical Ltd.
  8. #
  9. # This program is free software: you can redistribute it and/or modify it
  10. # under the terms of the GNU General Public License version 3, as published
  11. # by the Free Software Foundation.
  12. #
  13. # This program is distributed in the hope that it will be useful, but
  14. # WITHOUT ANY WARRANTY; without even the implied warranties of
  15. # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
  16. # PURPOSE.  See the GNU General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU General Public License along
  19. # with this program.  If not, see <http://www.gnu.org/licenses/>.
  20.  
  21. from twisted.internet import glib2reactor
  22. glib2reactor.install()
  23.  
  24. import atexit
  25. import dbus
  26. import dbus.mainloop.glib
  27. import gobject
  28. import logging
  29. import os
  30. import signal
  31. import sys
  32. import shutil
  33.  
  34. from ubuntuone.syncdaemon import dbus_interface, logger
  35. from ubuntuone.syncdaemon.config import (
  36.     get_config_files,
  37.     get_parsers,
  38.     xdg_cache_dir_parser,
  39.     xdg_data_dir_parser,
  40.     home_dir_parser,
  41. )
  42.  
  43. from ubuntuone.syncdaemon.main import Main
  44.  
  45. from configglue import configglue
  46. from twisted.internet import reactor
  47. from xdg.BaseDirectory import (
  48.     xdg_cache_home, 
  49.     xdg_data_home, 
  50. )
  51.  
  52. dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
  53.  
  54.  
  55. def is_already_running(): 
  56.     """ check if there is another instance registered in DBus """
  57.     bus = dbus.SessionBus()
  58.     request = bus.request_name(dbus_interface.DBUS_IFACE_NAME, 
  59.                                dbus.bus.NAME_FLAG_DO_NOT_QUEUE)
  60.     return request == dbus.bus.REQUEST_NAME_REPLY_EXISTS
  61.  
  62.  
  63. def die(msg):
  64.     logger.root_logger.warning(msg)
  65.     sys.stderr.write(msg + '\n')
  66.     sys.exit(1)
  67.  
  68.  
  69. def main(argv):
  70.     """ client entry point. """
  71.     args = argv[1:]
  72.     usage = "Usage: %prog [config file] [extra config files] [options] "
  73.     configs = []
  74.     while len(args) > 0 and not args[0].startswith('-'):
  75.         configs.append(args.pop(0))
  76.     if len(configs) == 0:
  77.         configs.extend(get_config_files())
  78.     (parser, options, argv) = configglue(file(configs[0]), *configs[1:], 
  79.                                args=args, usage=usage,
  80.                                extra_parsers=get_parsers())
  81.  
  82.     if options.debug:
  83.         logger.set_debug('stdout file')
  84.     else:
  85.         logger.set_level(options.log_level)
  86.  
  87.     # check we're not running as root, or have explicitely and in
  88.     # length expressed our desire to do so
  89.     if not (os.geteuid()
  90.             or options.im_ok_with_being_root_pretty_please_let_me_be_root):
  91.         die("Please don't run the syncdaemon as root.")
  92.  
  93.     # check if there is another instance running
  94.     if is_already_running():
  95.         die('Another instance is running')
  96.  
  97.     # check if we are using xdg_data_home and it doesn't exists
  98.     if xdg_data_home in options.data_dir and \
  99.        not os.path.exists(options.data_dir):
  100.         # if we have metadata in the old xdg_cache, move it!
  101.         old_data_dir = options.data_dir.replace(xdg_data_home, xdg_cache_home)
  102.         if os.path.exists(old_data_dir):
  103.             parent = os.path.dirname(options.data_dir) 
  104.             if os.path.exists(parent) and not os.access(parent, os.W_OK):
  105.                 # make the parent dir writable
  106.                 os.chmod(parent, 0775)
  107.             elif not os.path.exists(parent):
  108.                 # if it don't exits
  109.                 os.makedirs(parent)
  110.             shutil.move(old_data_dir, options.data_dir)
  111.     if not os.path.exists(options.data_dir):
  112.         parent = os.path.dirname(options.data_dir)
  113.         if os.path.exists(parent) and not os.access(parent, os.W_OK):
  114.             # make the parent dir writable
  115.             os.chmod(parent, 0775)
  116.         os.makedirs(options.data_dir)
  117.  
  118.     # create the partials_dir
  119.     partials_dir = os.path.join(xdg_cache_home, 'ubuntuone', 'partials')
  120.     if not os.path.exists(partials_dir):
  121.         os.makedirs(partials_dir)
  122.     
  123.     logger.rotate_logs()
  124.     main = Main(options.root_dir, options.shares_dir, options.data_dir,
  125.                 partials_dir, host=options.host, port=int(options.port), 
  126.                 dns_srv=options.dns_srv, ssl=True,
  127.                 disable_ssl_verify=options.disable_ssl_verify,
  128.                 realm=options.realm, mark_interval=options.mark_interval,
  129.                 dbus_events=options.send_events_over_dbus,
  130.                 handshake_timeout=options.handshake_timeout,
  131.                 max_handshake_timeouts=options.max_handshake_timeouts,
  132.                 shares_symlink_name='Shared With Me',
  133.                 read_limit=options.bandwidth_throttling_read_limit, 
  134.                 write_limit=options.bandwidth_throttling_write_limit, 
  135.                 throttling_enabled=options.bandwidth_throttling_on)
  136.     if options.oauth:
  137.         try:
  138.             (key, secret) = options.oauth.split(':', 2)
  139.         except ValueError:
  140.             parser.error("--oauth requires a key and secret together in the "
  141.                          " form KEY:SECRET")
  142.         main.set_oauth_token(key, secret)
  143.     
  144.     # override the reactor default signal handlers in order to 
  145.     # shutdown properly
  146.     atexit.register(reactor.callFromThread, main.quit)
  147.     def install_handlers():
  148.         """ install our custom signal handler. """
  149.         def handler(signum, frame):
  150.             logger.root_logger.debug("Signal received %s ", str(signum))
  151.             reactor.callFromThread(main.quit)
  152.         signal.signal(signal.SIGHUP, handler)
  153.         signal.signal(signal.SIGTERM, handler)
  154.         signal.signal(signal.SIGINT, handler)
  155.  
  156.     reactor.callWhenRunning(install_handlers)
  157.     # set the application name
  158.     gobject.set_application_name('ubuntuone-syncdaemon')
  159.  
  160.     # check if we should start the heapy monitor
  161.     if options.debug_heapy_monitor:
  162.         try:
  163.             import guppy.heapy.RM
  164.         except ImportError:
  165.             logger.root_logger.warning('guppy-pe/heapy not available, remote '
  166.                                        'monitor thread not started')
  167.     main.start()
  168.     if options.debug_lsprof_file:
  169.         try:
  170.             from bzrlib.lsprof import profile
  171.             ret, stats = profile(reactor.run)
  172.             stats.save(options.debug_lsprof_file)
  173.         except ImportError:
  174.             logger.root_logger.warning('bzrlib.lsprof not available')
  175.             reactor.run()
  176.     else:
  177.         reactor.run()
  178.  
  179.  
  180. if __name__ == '__main__':
  181.     try:
  182.         main(sys.argv)
  183.     except Exception:
  184.         logger.root_logger.exception('Unexpected error')
  185.         raise
  186.  
  187.